#include "wifi_sta_driver.h"
EventGroupHandle_t wifi_event_group;
const int CONNECTED_BIT = BIT0;
static const char *TAG_STA = "WiFi Sta";
static wifi_config_t wifi_config;

void wifi_sta_event_handler(void* arg, esp_event_base_t event_base,int32_t event_id, void* event_data)
{
    switch (event_id) 
    {
    case WIFI_EVENT_STA_START:
        printf("WIFI_EVENT_STA_START\n");
        break;
    case WIFI_EVENT_STA_CONNECTED:
        printf("Wi-Fi WIFI_EVENT_STA_CONNECTED\n");
        break;
    case WIFI_EVENT_STA_DISCONNECTED:
        printf("WIFI_EVENT_STA_DISCONNECTED\n");
        break;
    default:
        break;
    }
}




void ip_event_handler(void* arg, esp_event_base_t event_base,int32_t event_id, void* event_data)
{
    switch (event_id) 
    {
        case IP_EVENT_STA_GOT_IP: 
        {
        ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data;
        ESP_LOGI(TAG_STA, "Got IP:" IPSTR, IP2STR(&event->ip_info.ip));
        xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);
        printf("IP already get\n");
        break;
    }
    default:
        break;
    }
}


esp_err_t wifi_sta_enable()
{
    esp_err_t err=ESP_OK;
    if((err=esp_netif_init())!=ESP_OK)//初始化底层TCP/IP堆栈
    {
        printf("esp_netif_init err\n");
        return err;
    }
    wifi_event_group = xEventGroupCreate();
    if((err=esp_event_loop_create_default())!=ESP_OK)//创建事件循环
    {
        printf("esp_event_loop_create_default err\n");
        return err;
    }
    esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta();
    assert(sta_netif);
    if((err=esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_sta_event_handler, NULL))!=ESP_OK)//创建WIFI事件处理函数
    {
        printf("registe wifi_event_handler err\n");
        return err;
    }
    if((err=esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &ip_event_handler, NULL))!=ESP_OK)//创建IP事件处理函数
    {
        printf("registe ip_event_handler err\n");
        return err;
    }
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    if((err=esp_wifi_init(&cfg))!=ESP_OK)//配置wifi基础信息
    {
        printf("esp_wifi_init(&cfg) err\n");
        return err;
    }
    if((err=esp_wifi_set_mode(WIFI_MODE_STA))!=ESP_OK)//配置wifi_sta模式
    {
        printf("esp_wifi_set_mode(WIFI_MODE_STA) err\n");
        return err;
    }
    if((err=esp_wifi_start())!=ESP_OK)//配置wifi_sta模式
    {
        printf("esp_wifi_start() err\n");
        return err;
    }

    return err;


}


void wifi_sta_set_cfg(char *ssid,char* password)
{
    strncpy((char *)wifi_config.sta.ssid,ssid,strlen(ssid));
    strncpy((char *)wifi_config.sta.password,password,strlen(password));
}

void wifi_sta_connection()
{
    esp_wifi_set_config(WIFI_IF_STA,&wifi_config);
    esp_wifi_connect();
}

void wifi_sta_reconnection()
{
    esp_wifi_disconnect();
    esp_wifi_set_config(WIFI_IF_STA,&wifi_config);
    esp_wifi_connect();
}